// 发布订阅
// const observer = new Observer()
function Observer() {
  // 存储key和回调
  this.events = {}; // {牛奶: [fn,fn,fn]}
}

Observer.prototype.subscribe = function (key, fn) {
  // 牛奶  ()=>{}
  this.events[key] ? this.events[key].push(fn) : (this.events[key] = [fn]); // {'牛奶':[fn,fn,fn],'西瓜妹妹':[fn]}
};
Observer.prototype.emit = function (key) {
  // 找到 key 为牛奶的回调
  this.events[key] && this.events[key].forEach((fn) => fn());
};

function MyPromise(fn) {
  // 类 1. 传入一个回调
  this.value = undefined;
  const _this = this;
  this.observer = new Observer();
  function resolve(value) {
    // ...
    _this.value = value;
    // 发布
    _this.observer.emit("resolve");
  }
  function reject(err) {
    // ...
    console.log(err);
  }
  fn(resolve, reject);
}

MyPromise.prototype.then = function (fn) {
  return new MyPromise((resolve, reject) => {
    this.observer.subscribe("resolve", () => {
      resolve(fn(this.value));
    });
  });
  // 订阅
};
const p = new MyPromise((resolve, reject) => {
  // 处理异步
  setTimeout(() => {
    resolve("成功");
    // 步骤一
  }, 1000);
});
// 1. p能够.then
// 2. p.then的参数是一个函数
// 3. 这个函数需要被执行
p.then((res) => {
  console.log(res);
  return 123;
})
  .then((res) => {
    console.log(res);
    return 456;
  })
  .then((res) => {
    console.log(res);
    return 789;
  })
  .then((res) => {
    console.log(res);
    return 101112;
  })
  .then((res) => {
    console.log(res);
    return 131415;
  })
  .then((res) => {
    console.log(res);
  });

// 怎么才能让一个回调执行完 再执行另一个回调
// 2. 发布 1. 订阅 设计模式
// 一个地方  回调
